﻿#include "KSynthesisMin5.h"
#include "Tools.h"

KSynthesisMin5::KSynthesisMin5(const std::string &pSymbol) : KSynthesisMin1(pSymbol)
{
}


KSynthesisMin5::~KSynthesisMin5()
{
}

void KSynthesisMin5::SynthesisFrmList(const std::deque<MData::KLineItem> &frmKItems, std::deque<MData::KLineItem> &outKItems)
{
	// 一分钟K线的合成
	std::deque<MData::KLineItem> kItem1List;
	KSynthesisMin1::SynthesisFrmList(frmKItems, kItem1List);
	// 进一步将1分钟合成5分钟

	std::deque<MData::KLineItem> kitem5List;
	time_t tarKItemBegin = 0, tarKItemEnd = 0;
	MData::KLineItem opKItem;
	for (std::deque<MData::KLineItem>::iterator it = kItem1List.begin(); it != kItem1List.end(); ++it)
	{
		if (tarKItemBegin == 0)
		{
			opKItem = *it; // 初始化K线
			getKItemRange(it->UpdateTime, tarKItemBegin, tarKItemEnd);
			continue;
		}
		if (it->UpdateTime < tarKItemBegin) // 那这个K线肯定有问题
		{
			continue;
		}
		if (it->UpdateTime > tarKItemEnd) // 这是新的K线了
		{
			// 上一根K线要记录
			kitem5List.emplace_back(opKItem);
			// 初始化
			opKItem = *it; // 初始化K线
			getKItemRange(it->UpdateTime, tarKItemBegin, tarKItemEnd);
			continue;
		}
		// 更新K线
		UpdateCloseValue(opKItem, *it);
	}
	outKItems.swap(kitem5List);
}

void KSynthesisMin5::SynthesisFrmTime(time_t pTime, MData::KLineItem &outKItem)
{
	outKItem.UpdateTime = 0;
	// 上调1分，下调1分，取这个时间范围内的K线
	MDIO::KItem kStream;
	std::deque<MData::KLineItem> srcKItems;
	time_t beginTime = pTime - 300;
	time_t endTime = pTime + 300;
	kStream.ReadKItemsInTimes(m_symbolName, beginTime, endTime, srcKItems);
	if (srcKItems.empty())
	{
		return;
	}
	// K线的时间范围
	time_t beginKTime = 0, endKTime = 0;
	getKItemRange(pTime, beginKTime, endKTime);

	std::deque<MData::KLineItem> nKItems;
	GetMinuteKItems(srcKItems, beginKTime, endKTime, nKItems);
	if (nKItems.empty())
	{
		return;
	}
	// 理论上这里的K线在5分钟之内
	outKItem = nKItems.front();
	for (std::deque<MData::KLineItem>::iterator it = nKItems.begin(); it != nKItems.end(); ++it)
	{
		UpdateCloseValue(outKItem, *it);
	}
}

bool KSynthesisMin5::IsThisKItemFinished(time_t pLaskKUpdateTime, time_t curTime)
{
	if (pLaskKUpdateTime <= 0)
	{
		return false;
	}
	time_t beginKTime = 0, endKTime = 0;
	getKItemRange(pLaskKUpdateTime, beginKTime, endKTime);
	if (curTime > endKTime)
	{
		return true;
	}
	return false;
}

void KSynthesisMin5::getKItemRange(time_t pUpdateTime, time_t &outKItemBegin, time_t &outKItemEnd)
{
	tm pDataTime = Tools::GetDateTimeFrmStamp(pUpdateTime);

	tm itemStart = pDataTime;
	itemStart.tm_min = (pDataTime.tm_min / 5) * 5;
	itemStart.tm_sec = 0;
	outKItemBegin = Tools::GetTimeStamp(itemStart);

	outKItemEnd = outKItemBegin + 299;
}
